﻿#ifndef GLOBALSTATIC_H
#define GLOBALSTATIC_H

#include <QMap>

#include "enum.h"
#include "datastruct.h"

class GlobalStatic
{
public:
    GlobalStatic();

    // 时统零点计算使用
    static qint64 getZeroTimeStamp();
    static void setZeroTimeStamp(const qint64 zeroTimeStamp);

    // 复位的状态
    static int getGPIOResetStatus();
    static void setGPIOResetStatus(const int status);

    // 正弦仿真使用
    static bool getSining();
    static double getSinT();
    static double getSinA();
    static qint64 getSinZeroTimeStamp();
    static qint64 getSinDestTimeStamp();
    static bool getSinSquare();
    static void setSinStart(const double sinT, const double sinA, const int tcount, bool sinSquare = false);
    static void setSinStop();
    static void beforeSining();

    // 数据类型
    static DataType getDataType(const QString dataType);
    static void initDataType();

    // 存储的字节长度
    static qint32 getDataLength();
    static void setDataLength(const qint32 dataLength);

    // 控制电机使用
    static QByteArray getCmd(const QString& name);
    static void initCmd(const QList<Cmd>& cmdList);

    // 训练步骤
    static QString getTrainStep(const QString& stepCode);
    static void initTrainStep(const QList<TrainStep>& trainStepList);


    // 训练考试是否已经开始及开始时间
    static bool training();
    static void setTraining(const bool training);
    static qint64 trainStartTime();
    static void setTrainStartTime(const qint64& trainStartTime);

    // 帧计数
    static quint16 sendFrameCount();
    static void increaseSendFrameCount();

    // 计划码
    static QByteArray planCode();
    static void setPlanCode(const QByteArray& planCode);

    // 科目编号
    static QString courseNumber();
    static void setCourseNumber(const QString& courseNumber);

    // 故障数量
    static quint16 faultCount();
    static void setFaultCount(const quint16& faultCount);

    // 注入的故障码
    static QStringList faultCodes();
    static bool containFaultCode(const QString& faultCode);
    static void clearFaultCode();
    static void appendFaultCode(const QString& faultCode);

    // 故障得分
    static double faultScore(const QString faultCode);
    static void clearFaultScore();
    static void setFaultScore(const QString faultCode, const double faultScore);

    // 已经训练的流程步骤
    static void initializeTrainStep(const int level);
    static void assignTrainStep(const QString code);
    static void resetTrainStep();
    static int getTrainedStepCount();
    static int getTotalStepCount();



    // 计算校验和
    static unsigned char getSumCheck(const QByteArray &data, int offset, int length) {
        int sum = 0;
        for (int i = offset; i < length; i++)
            sum += static_cast<unsigned char>( data.at(i) );

        return static_cast<unsigned char>( sum % 256 );
    }


private:
    // 计时: 时统零点
    static qint64 g_zeroTimeStamp;

    // 复位的状态
    static int g_gpioResetStatus;

    // 是否在进行正弦仿真
    static bool g_sining;
    // 正弦仿真的周期T(单位:s), 振幅A, 仿真周期个数
    static double g_sinT;
    static double g_sinA;
    // 正弦仿真开始的时间戳
    static qint64 g_sinZeroTimeStamp;
    // 根据仿真周期个数计算正弦仿真完成的时间戳
    static qint64 g_sinDestTimeStamp;
    // 把正弦仿真模拟出方波的效果
    static bool g_sinSquare;


    // 数据类型
    static QMap<QString, DataType> g_dataTypeMap;
    // 存储的字节长度
    static qint32 g_dataLength;

    // 电机指令
    static QMap<QString, QByteArray> g_cmdMap;

    // 训练步骤: key流程步骤编码, value流程步骤名称
    static QMap<QString, QString> g_trainStepMap;

    // 训练考试是否已经开始及开始时间
    static bool g_training;
    static qint64 g_trainStartTime;

    // 发送帧计数
    static quint16 g_sendFrameCount;

    // 计划码
    static QByteArray g_planCode;

    // 科目编号
    static QString g_courseNumber;

    // 故障数量
    static quint16 g_faultCount;
    // 注入的故障
    static QStringList g_faultCodes;
    // 故障得分
    static QMap<QString, double> g_faultScoreMap;

    // 记录流程步骤是否已经进行过
    static QMap<QString, bool> g_stepTrainedMap;
};

#endif // GLOBALSTATIC_H
